UnityTestについて


概要

AssetStoreにある、UnityのTestToolっぽいもの。

実際にはなんなんだろう?

実機だとどう動作するんだろう?


これは何?

Assertion、



Assertion Componentってのがあってイイ、、とおもうんだけど、うんまあ、、はい、、

Unity使ってて不満だったのが、デフォルトのAssertionメソッドが無かった事。

gameObjectに対してセットするComponentとして、条件を指定する形式の実装がなされている。


Componentとして実装されているので、コードベースでやるよりも

・いつのチェックか

・何と比べるか

が、いろいろセットできてよい。

Assertionがそこかしこに書かれるよりはいい、、のかなあ。

ちょっと解んないよ。



Assertionすると実際どうなるの? AssertionのExampleを実行してみる

Assetを入れてみると、Exampleが2つ入っているので、見てみる。

スクリーンショット 2014-01-14 11.10.37.png

AssertionExampleScene.unity を開いてプレイすると、

ボールが画面奥に転がっていって下記Assertion fail の群が出る。


AssertionException: Sphere assertion failed.

(Sphere (UnityEngine.GameObject)).gameObject.renderer CompareToObject (Main Camera (UnityEngine.GameObject)).Camera failed.

UnityEngine.Debug:LogException(Exception, Object)

UnityTest.Assertions:CheckAssertions(AssertionComponent[]) (at Assets/UnityTestTools/Assertions/Assertions.cs:61)

UnityTest.Assertions:CheckAssertions(AssertionComponent) (at Assets/UnityTestTools/Assertions/Assertions.cs:16)

UnityTest.AssertionComponent:CheckAssertionFor(CheckMethod) (at Assets/UnityTestTools/Assertions/AssertionComponent.cs:260)

UnityTest.AssertionComponent:Update() (at Assets/UnityTestTools/Assertions/AssertionComponent.cs:156)

Sphereとcameraに関するassertion fail


AssertionException: Sphere assertion failed.

(Sphere (UnityEngine.GameObject)).Transform.position.y CompareToObject (Plane (UnityEngine.GameObject)).Transform.position.y failed.

UnityEngine.Debug:LogException(Exception, Object)

UnityTest.Assertions:CheckAssertions(AssertionComponent[]) (at Assets/UnityTestTools/Assertions/Assertions.cs:61)

UnityTest.Assertions:CheckAssertions(AssertionComponent) (at Assets/UnityTestTools/Assertions/Assertions.cs:16)

UnityTest.AssertionComponent:CheckAssertionFor(CheckMethod) (at Assets/UnityTestTools/Assertions/AssertionComponent.cs:260)

UnityTest.AssertionComponent:FixedUpdate() (at Assets/UnityTestTools/Assertions/AssertionComponent.cs:162)

SphereとPlaneのposition.yに関するassertion fail


これらは、SphereのInspector上で、コンポーネントとしてセットしてあった。

Sphereのコンポーネントに下記2つのAssertion設定がある。

スクリーンショット 2014-01-14 11.20.50.png


なるほどなー。SphereとMain Cameraとか、SphereとPlaneを比較して、

それぞれのプロパティの何がどうなったらダメ、とかを指定できる形。


Assertionのバリエーションはこんな感じ


何を比較するか

スクリーンショット 2014-01-14 11.33.51.png

いつ比較するか

スクリーンショット 2014-01-14 11.33.56.png



試しに、SphereにSphereScript.csというスクリプトを新たにくっつけて、

パブリックなVector3のパラメータ myVector3 を実装してみたうえで、

スクリーンショット 2014-01-14 11.37.30.png



Sphereにアタッチ + AssertionComponentを付け加えたところ、

スクリーンショット 2014-01-14 11.41.38.png


確かに、SphereScript.myVector をターゲットに指定して、Nullじゃないよね!? みたいなチェックができる。

スクリーンショット 2014-01-14 11.39.30.png

で、実行してみると、

チェックのタイミングをStart時にしたので、もちろんNullなmyVecotrのAssertionは失敗、下記が出た。

ArgumentException: Null was passed to a value-type argument

UnityTest.ComparerBaseGeneric`2[UnityEngine.Vector3,UnityEngine.Vector3].Compare (System.Object a, System.Object b) (at Assets/UnityTestTools/Assertions/Comparers/ComparerBase.cs:113)

UnityTest.ComparerBase.Compare (System.Object objVal) (at Assets/UnityTestTools/Assertions/Comparers/ComparerBase.cs:44)

UnityTest.ActionBase.Compare () (at Assets/UnityTestTools/Assertions/Comparers/ActionBase.cs:30)

UnityTest.Assertions.CheckAssertions (UnityTest.AssertionComponent[] assertions) (at Assets/UnityTestTools/Assertions/Assertions.cs:32)

UnityTest.Assertions.CheckAssertions (UnityTest.AssertionComponent assertion) (at Assets/UnityTestTools/Assertions/Assertions.cs:16)

UnityTest.AssertionComponent.CheckAssertionFor (CheckMethod checkMethod) (at Assets/UnityTestTools/Assertions/AssertionComponent.cs:260)

UnityTest.AssertionComponent.Start () (at Assets/UnityTestTools/Assertions/AssertionComponent.cs:103)


インスペクタは別途あり、そこから一覧をみることができる。

適当なIdentityになりうる文字列とかを入れさせてほしいなーっ、、て思うが。


Assertion感

Good:

オブジェクトに対して制約を付けられる

タイミング系とかを細かくセットできるのはうれしいなって。


Bad:

AssertionのIdentityが付けられない。

コメントはそれ単体でエラーにならないので否だけど、

自分は「このAssertionに失敗するってことはこういう不味いことが起こってるんだぜ」とかを、Assertion失敗時に表示したいなー。


たとえば、

Assert(0 < A.transform.position.z, "一瞬たりともAのz位置が0とかマイナスなんてありえない!!" );


みたいに書きたい。

Assertion Fail 時には、

Assertion Failed: "一瞬たりともAのz位置が0とかマイナスなんてありえない!!"とか出したい。

これはComponent上でセットできても良いと思うんだけどなー。



つづきはまた今度書く。